
14.06.2011, 17:04
|
 |
Интересующийся
|
|
Регистрация: 19.01.2011
Сообщений: 18
|
|
Универсальная функция Ajax запроса
Собрав всё что нашёл я "сконструировал" следующую фунцкию:
function ajax_load(where,what) // Ajax загрузка
{
//where - адрес скрипта или документа
//what - POST запрос
var xml;
if(window.ActiveXObject)
{
xml=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
if(window.XMLHttpRequest)
{
xml=new XMLHttpRequest();
}
else
{
alert('Видимо в вашем браузере не поддреживается ajax');
}
}
xml.onreadystatechange = function()
{
if(xml.readyState != 4 || xml.readyState==0)
{
}
if(xml.readyState == 4)
{
if(xml.status == 200)
{
return xml.responseText;
}
else
{
return false;
}
}
}
xml.open("POST", where, true);
xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xml.send(what);
}
Я её промониторил, в переменную xml.responseText правильно записывается содержимое страницы, но функция не возвращает его через return. В итоге возвращается undefined. Помогите, возможна ли такая универсальная функция?
|
|

14.06.2011, 17:08
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Finesse
|
*!*xml.open("POST", where, true);*/!*
|
open(method,url,async,uname,pswd)
короче, надо
xml.open("POST", where, false);
или пишите колбэки. но вам, походу, необходимо последовательное исполнение скрипта, а не асинхронное прыгание туда-сюда
|
|

14.06.2011, 17:12
|
 |
Интересующийся
|
|
Регистрация: 19.01.2011
Сообщений: 18
|
|
Сообщение от melky
|
open(method,url,async,uname,pswd)
короче, надо
xml.open("POST", where, false);
или пишите колбэки. но вам, походу, необходимо последовательное исполнение скрипта, а не асинхронное прыгание туда-сюда
|
Не помогло (
Я предполагаю, что функция завершается сама не успевая выполнить достаточно раз функцию xml.onreadystatechange (успевает вызвать 2 раза) и не находя return возвращает undefined. Может её как-то задержать можно?
Последний раз редактировалось Finesse, 14.06.2011 в 17:15.
|
|

15.06.2011, 03:46
|
 |
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
/**
* @public
* @return {XMLHttpRequest, ActiveXObject}
* @param {Function} callback
* @param {String} mode
*/
function getXmlHttpRequest(callback, mode) {
var xhr = null;
if (window.XMLHttpRequest !== undefined) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject !== undefined) {
xhr = new ActiveXObject('Msxml2.XMLHTTP.6.0') ||
new ActiveXObject('Msxml2.XMLHTTP.3.0') ||
new ActiveXObject('Microsoft.XMLHTTP');
} else {
throw new Error('Ajax is not supported.');
}
if (xhr !== null && typeof(callback) === 'function') {
var fn = function() {
if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 304)) {
switch (mode) {
case 'text':
callback(xhr.responseText);
break;
case 'xml':
callback(xhr.responseXML);
break;
default:
callback();
break;
}
}
}
xhr.onreadystatechange = fn;
}
return xhr;
}
Использовать вот так:
var xhr = getXmlHttpRequest(function(response) {
alert(response);
}, 'text');
xhr.open('GET', 'path/to/your/script.php', true);
xhr.send();
Кроссбраузерность: Chrome, Safari, Firefox, Opera, IE5.5-9.0.
Последний раз редактировалось DreamTheater, 15.06.2011 в 11:16.
|
|

15.06.2011, 03:58
|
 |
Интересующийся
|
|
Регистрация: 19.01.2011
Сообщений: 18
|
|
Я понял почему return ничего не возвращает и доработал функцию, теперь всё нормально
function ajax_load(where,what) // Ajax загрузка
{
var xml;
var t;
if(window.ActiveXObject)
{
xml=new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
if(window.XMLHttpRequest)
{
xml=new XMLHttpRequest();
}
else
{
alert('Видимо в вашем браузере не поддреживается ajax');
}
}
xml.onreadystatechange = function()
{
if(xml.readyState != 4 || xml.readyState==0)
{
}
if(xml.readyState == 4)
{
if(xml.status == 200)
{
t = xml.responseText;
}
else
{
t = false;
}
}
}
xml.open("POST", where, false);
xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xml.send(what);
if(t)
{
return t;
}
else
{
return false;
}
}
|
|

15.06.2011, 11:17
|
 |
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
Сообщение от Finesse
|
Я понял почему return ничего не возвращает
|
Потому что return пишется только один раз в самом конце функции.
|
|

15.06.2011, 12:30
|
 |
Интересующийся
|
|
Регистрация: 19.01.2011
Сообщений: 18
|
|
Сообщение от DreamTheater
|
Потому что return пишется только один раз в самом конце функции.
|
Потому что тот return действовал в пределах вложенной функкции.
P.S. Return можно поставить в любом месте функции, причём функция завершается после вывода результата.
Последний раз редактировалось Finesse, 15.06.2011 в 13:34.
|
|

15.06.2011, 14:07
|
 |
Профессор
|
|
Регистрация: 06.05.2009
Сообщений: 1,163
|
|
Люди, простите конечно, но разве это универсальная функция ajax запроса? Не верю.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|

15.06.2011, 14:12
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
конечно нет.
но это он сам написал.
например,
для меня моя анимация через тэг <style>(использование CSS3, или просто анимирование элементов пачками) - идеальная анимация
|
|

15.06.2011, 14:20
|
 |
Интересующийся
|
|
Регистрация: 19.01.2011
Сообщений: 18
|
|
Сообщение от Nekromancer
|
Люди, простите конечно, но разве это универсальная функция ajax запроса? Не верю.
|
Можно ещё добавить разные параметры, например метод запроса и прокси сервер, но с помощью этой функции можно получить содержимое страницы в переменную
|
|
|
|